home *** CD-ROM | disk | FTP | other *** search
- <?php
-
- // The constant telling us what day starts the week. Monday (1) is the
- // international standard. Redefine this to 0 if you want weeks to
- // begin on Sunday.
- define('DATE_CALC_BEGIN_WEEKDAY', 1);
-
- /**
- * Date_Calc is a calendar class used to calculate and
- * manipulate calendar dates and retrieve dates in a calendar
- * format. It does not rely on 32-bit system date stamps, so
- * you can display calendars and compare dates that date
- * pre 1970 and post 2038.
- *
- * This source file is subject to version 2.02 of the PHP license,
- * that is bundled with this package in the file LICENSE, and is
- * available at through the world-wide-web at
- * http://www.php.net/license/2_02.txt.
- * If you did not receive a copy of the PHP license and are unable to
- * obtain it through the world-wide-web, please send a note to
- * license@php.net so we can mail you a copy immediately.
- *
- * Copyright (c) 1999, 2000 ispi
- *
- * @access public
- *
- * @version 1.2.2
- * @author Monte Ohrt <monte@ispi.net>
- */
-
- class Date_Calc {
-
- /**
- * Returns the current local date. NOTE: This function
- * retrieves the local date using strftime(), which may
- * or may not be 32-bit safe on your system.
- *
- * @param string the strftime() format to return the date
- *
- * @access public
- *
- * @return string the current date in specified format
- */
-
- function dateNow($format="%Y%m%d")
- {
- return(strftime($format,time()));
-
- } // end func dateNow
-
- /**
- * Returns true for valid date, false for invalid date.
- *
- * @param string year in format CCYY
- * @param string month in format MM
- * @param string day in format DD
- *
- * @access public
- *
- * @return boolean true/false
- */
-
- function isValidDate($day, $month, $year)
- {
-
- if(empty($year) || empty($month) || empty($day))
- return false;
-
- // must be digits only
- if(preg_match("/\D/",$year))
- return false;
- if(preg_match("/\D/",$month))
- return false;
- if(preg_match("/\D/",$day))
- return false;
-
- if($year < 0 || $year > 9999)
- return false;
- if($month < 1 || $month > 12)
- return false;
- if($day < 1 || $day > 31 || $day > Date_Calc::daysInMonth($month,$year))
- return false;
-
- return true;
-
- } // end func isValidDate
-
- function isLeapYear($year="")
- {
-
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
-
- if(strlen($year) != 4)
- return false;
-
- if(preg_match("/\D/",$year))
- return false;
-
- return (($year % 4 == 0 && $year % 100 != 0) || $year % 400 == 0);
-
- } // end func isLeapYear
-
- /**
- * Determines if given date is a future date from now.
- *
- * @param string year in format CCYY
- * @param string month in format MM
- * @param string day in format DD
- *
- * @access public
- *
- * @return boolean true/false
- */
-
- function isFutureDate($day,$month,$year)
- {
- $this_year = Date_Calc::dateNow("%Y");
- $this_month = Date_Calc::dateNow("%m");
- $this_day = Date_Calc::dateNow("%d");
-
-
- if($year > $this_year)
- return true;
- elseif($year == $this_year)
- if($month > $this_month)
- return true;
- elseif($month == $this_month)
- if($day > $this_day)
- return true;
-
- return false;
-
- } // end func isFutureDate
-
- /**
- * Determines if given date is a past date from now.
- *
- * @param string year in format CCYY
- * @param string month in format MM
- * @param string day in format DD
- *
- * @access public
- *
- * @return boolean true/false
- */
-
- function isPastDate($day,$month,$year)
- {
- $this_year = Date_Calc::dateNow("%Y");
- $this_month = Date_Calc::dateNow("%m");
- $this_day = Date_Calc::dateNow("%d");
-
-
- if($year < $this_year)
- return true;
- elseif($year == $this_year)
- if($month < $this_month)
- return true;
- elseif($month == $this_month)
- if($day < $this_day)
- return true;
-
- return false;
-
- } // end func isPastDate
-
- /**
- * Returns day of week for given date, 0=Sunday
- *
- * @param string year in format CCYY, default is current local year
- * @param string month in format MM, default is current local month
- * @param string day in format DD, default is current local day
- *
- * @access public
- *
- * @return int $weekday_number
- */
-
- function dayOfWeek($day="",$month="",$year="")
- {
-
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
- if(empty($day))
- $day = Date_Calc::dateNow("%d");
-
- if($month > 2)
- $month -= 2;
- else
- {
- $month += 10;
- $year--;
- }
-
- $day = ( floor((13 * $month - 1) / 5) +
- $day + ($year % 100) +
- floor(($year % 100) / 4) +
- floor(($year / 100) / 4) - 2 *
- floor($year / 100) + 77);
-
- $weekday_number = (($day - 7 * floor($day / 7)));
-
- return $weekday_number;
-
- } // end func dayOfWeek
-
- /**
- * Returns week of the year, first Sunday is first day of first week
- *
- * @param string year in format CCYY
- * @param string month in format MM
- * @param string day in format DD
- *
- * @access public
- *
- * @return integer $week_number
- */
-
- function weekOfYear($day,$month,$year)
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
- if(empty($day))
- $day = Date_Calc::dateNow("%d");
-
- $week_year = $year - 1501;
- $week_day = $week_year * 365 + floor($week_year / 4) - 29872 + 1
- - floor($week_year / 100) + floor(($week_year - 300) / 400);
-
- $week_number =
- floor((Date_Calc::julianDate($day,$month,$year) + floor(($week_day + 4) % 7)) / 7);
-
- return $week_number;
-
- } // end func weekOfYear
-
- /**
- * Returns number of days since 31 December of year before given date.
- *
- * @param string year in format CCYY, default is current local year
- * @param string month in format MM, default is current local month
- * @param string day in format DD, default is current local day
- *
- * @access public
- *
- * @return int $julian
- */
-
- function julianDate($day="",$month="",$year="")
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
- if(empty($day))
- $day = Date_Calc::dateNow("%d");
-
- $days = array(0,31,59,90,120,151,181,212,243,273,304,334);
-
- $julian = ($days[$month - 1] + $day);
-
- if($month > 2 && Date_Calc::isLeapYear($year))
- $julian++;
-
- return($julian);
-
- } // end func julianDate
-
- /**
- * Returns quarter of the year for given date
- *
- * @param string year in format CCYY, default current local year
- * @param string month in format MM, default current local month
- * @param string day in format DD, default current local day
- *
- * @access public
- *
- * @return int $year_quarter
- */
-
- function quarterOfYear($day="",$month="",$year="")
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
- if(empty($day))
- $day = Date_Calc::dateNow("%d");
-
- $year_quarter = (intval(($month - 1) / 3 + 1));
-
- return $year_quarter;
-
- } // end func quarterOfYear
-
- /**
- * Returns date of begin of next month of given date.
- *
- * @param string year in format CCYY, default current local year
- * @param string month in format MM, default current local month
- * @param string day in format DD, default current local day
- * @param string format for returned date
- *
- * @access public
- *
- * @return string date in given format
- */
-
- function beginOfNextMonth($day="",$month="",$year="",$format="%Y%m%d")
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
- if(empty($day))
- $day = Date_Calc::dateNow("%d");
-
- if($month < 12)
- {
- $month++;
- $day=1;
- }
- else
- {
- $year++;
- $month=1;
- $day=1;
- }
-
- return Date_Calc::dateFormat($day,$month,$year,$format);
-
- } // end func beginOfNextMonth
-
- /**
- * Returns date of the last day of next month of given date.
- *
- * @param string year in format CCYY, default current local year
- * @param string month in format MM, default current local month
- * @param string day in format DD, default current local day
- * @param string format for returned date
- *
- * @access public
- *
- * @return string date in given format
- */
-
- function endOfNextMonth($day="",$month="",$year="",$format="%Y%m%d")
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
- if(empty($day))
- $day = Date_Calc::dateNow("%d");
-
-
- if($month < 12)
- {
- $month++;
- }
- else
- {
- $year++;
- $month=1;
- }
-
- $day = Date_Calc::daysInMonth($month,$year);
-
- return Date_Calc::dateFormat($day,$month,$year,$format);
-
- } // end func endOfNextMonth
-
- /**
- * Returns date of the first day of previous month of given date.
- *
- * @param string year in format CCYY, default current local year
- * @param string month in format MM, default current local month
- * @param string day in format DD, default current local day
- * @param string format for returned date
- *
- * @access public
- *
- * @return string date in given format
- */
-
- function beginOfPrevMonth($day="",$month="",$year="",$format="%Y%m%d")
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
- if(empty($day))
- $day = Date_Calc::dateNow("%d");
-
- if($month > 1)
- {
- $month--;
- $day=1;
- }
- else
- {
- $year--;
- $month=12;
- $day=1;
- }
-
- return Date_Calc::dateFormat($day,$month,$year,$format);
-
- } // end func beginOfPrevMonth
-
- /**
- * Returns date of the last day of previous month for given date.
- *
- * @param string year in format CCYY, default current local year
- * @param string month in format MM, default current local month
- * @param string day in format DD, default current local day
- * @param string format for returned date
- *
- * @access public
- *
- * @return string date in given format
- */
-
- function endOfPrevMonth($day="",$month="",$year="",$format="%Y%m%d")
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
- if(empty($day))
- $day = Date_Calc::dateNow("%d");
-
- if($month > 1)
- {
- $month--;
- }
- else
- {
- $year--;
- $month=12;
- }
-
- $day = Date_Calc::daysInMonth($month,$year);
-
- return Date_Calc::dateFormat($day,$month,$year,$format);
-
- } // end func endOfPrevMonth
-
- /**
- * Returns date of the next weekday of given date,
- * skipping from Friday to Monday.
- *
- * @param string year in format CCYY, default current local year
- * @param string month in format MM, default current local month
- * @param string day in format DD, default current local day
- * @param string format for returned date
- *
- * @access public
- *
- * @return string date in given format
- */
-
- function nextWeekday($day="",$month="",$year="",$format="%Y%m%d")
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
- if(empty($day))
- $day = Date_Calc::dateNow("%d");
-
- $days = Date_Calc::dateToDays($day,$month,$year);
-
- if(Date_Calc::dayOfWeek($day,$month,$year) == 5)
- $days += 3;
- elseif(Date_Calc::dayOfWeek($day,$month,$year) == 6)
- $days += 2;
- else
- $days += 1;
-
- return(Date_Calc::daysToDate($days,$format));
-
- } // end func nextWeekday
-
- /**
- * Returns date of the previous weekday,
- * skipping from Monday to Friday.
- *
- * @param string year in format CCYY, default current local year
- * @param string month in format MM, default current local month
- * @param string day in format DD, default current local day
- * @param string format for returned date
- *
- * @access public
- *
- * @return string date in given format
- */
-
- function prevWeekday($day="",$month="",$year="",$format="%Y%m%d")
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
- if(empty($day))
- $day = Date_Calc::dateNow("%d");
-
- $days = Date_Calc::dateToDays($day,$month,$year);
-
- if(Date_Calc::dayOfWeek($day,$month,$year) == 1)
- $days -= 3;
- elseif(Date_Calc::dayOfWeek($day,$month,$year) == 0)
- $days -= 2;
- else
- $days -= 1;
-
- return(Date_Calc::daysToDate($days,$format));
-
- } // end func prevWeekday
-
- /**
- * Returns date of the next specific day of the week
- * from the given date.
- *
- * @param int day of week, 0=Sunday
- * @param string year in format CCYY, default current local year
- * @param string month in format MM, default current local month
- * @param string day in format DD, default current local day
- * @param boolean onOrAfter if true and days are same, returns current day
- * @param string format for returned date
- *
- * @access public
- *
- * @return string date in given format
- */
-
- function nextDayOfWeek($dow,$day="",$month="",$year="",$format="%Y%m%d",$onOrAfter=false)
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
- if(empty($day))
- $day = Date_Calc::dateNow("%d");
-
- $days = Date_Calc::dateToDays($day,$month,$year);
- $curr_weekday = Date_Calc::dayOfWeek($day,$month,$year);
-
- if($curr_weekday == $dow)
- {
- if(!$onOrAfter)
- $days += 7;
- }
- elseif($curr_weekday > $dow)
- $days += 7 - ( $curr_weekday - $dow );
- else
- $days += $dow - $curr_weekday;
-
- return(Date_Calc::daysToDate($days,$format));
-
- } // end func nextDayOfWeek
-
- /**
- * Returns date of the previous specific day of the week
- * from the given date.
- *
- * @param int day of week, 0=Sunday
- * @param string year in format CCYY, default current local year
- * @param string month in format MM, default current local month
- * @param string day in format DD, default current local day
- * @param boolean onOrBefore if true and days are same, returns current day
- * @param string format for returned date
- *
- * @access public
- *
- * @return string date in given format
- */
-
- function prevDayOfWeek($dow,$day="",$month="",$year="",$format="%Y%m%d",$onOrBefore=false)
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
- if(empty($day))
- $day = Date_Calc::dateNow("%d");
-
- $days = Date_Calc::dateToDays($day,$month,$year);
- $curr_weekday = Date_Calc::dayOfWeek($day,$month,$year);
-
- if($curr_weekday == $dow)
- {
- if(!$onOrBefore)
- $days -= 7;
- }
- elseif($curr_weekday < $dow)
- $days -= 7 - ( $dow - $curr_weekday );
- else
- $days -= $curr_weekday - $dow;
-
- return(Date_Calc::daysToDate($days,$format));
-
- } // end func prevDayOfWeek
-
- /**
- * Returns date of the next specific day of the week
- * on or before the given date.
- *
- * @param int day of week, 0=Sunday
- * @param string year in format CCYY, default current local year
- * @param string month in format MM, default current local month
- * @param string day in format DD, default current local day
- * @param string format for returned date
- *
- * @access public
- *
- * @return string date in given format
- */
-
- function nextDayOfWeekOnOrAfter($dow,$day="",$month="",$year="",$format="%Y%m%d")
- {
- return(Date_Calc::nextDayOfWeek($dow,$day="",$month="",$year="",$format="%Y%m%d",true));
- } // end func nextDayOfWeekOnOrAfter
-
- /**
- * Returns date of the previous specific day of the week
- * on or before the given date.
- *
- * @param int day of week, 0=Sunday
- * @param string year in format CCYY, default current local year
- * @param string month in format MM, default current local month
- * @param string day in format DD, default current local day
- * @param string format for returned date
- *
- * @access public
- *
- * @return string date in given format
- */
-
- function prevDayOfWeekOnOrBefore($dow,$day="",$month="",$year="",$format="%Y%m%d")
- {
- return(Date_Calc::prevDayOfWeek($dow,$day="",$month="",$year="",$format="%Y%m%d",true));
-
- } // end func prevDayOfWeekOnOrAfter
-
- /**
- * Returns date of day after given date.
- *
- * @param string year in format CCYY, default current local year
- * @param string month in format MM, default current local month
- * @param string day in format DD, default current local day
- * @param string format for returned date
- *
- * @access public
- *
- * @return string date in given format
- */
-
- function nextDay($day="",$month="",$year="",$format="%Y%m%d")
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
- if(empty($day))
- $day = Date_Calc::dateNow("%d");
-
- $days = Date_Calc::dateToDays($day,$month,$year);
-
- return(Date_Calc::daysToDate($days + 1,$format));
-
- } // end func nextDay
-
- /**
- * Returns date of day before given date.
- *
- * @param string year in format CCYY, default current local year
- * @param string month in format MM, default current local month
- * @param string day in format DD, default current local day
- * @param string format for returned date
- *
- * @access public
- *
- * @return string date in given format
- */
-
- function prevDay($day="",$month="",$year="",$format="%Y%m%d")
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
- if(empty($day))
- $day = Date_Calc::dateNow("%d");
-
- $days = Date_Calc::dateToDays($day,$month,$year);
-
- return(Date_Calc::daysToDate($days - 1,$format));
-
- } // end func prevDay
-
- /**
- * Sets century for 2 digit year.
- * 51-99 is 19, else 20
- *
- * @param string 2 digit year
- *
- * @access public
- *
- * @return string 4 digit year
- */
-
- function defaultCentury($year)
- {
- if(strlen($year) == 1)
- $year = "0$year";
- if($year > 50)
- return( "19$year" );
- else
- return( "20$year" );
-
- } // end func defaultCentury
-
- /**
- * Returns number of days between two given dates.
- *
- * @param string year in format CCYY
- * @param string month in format MM
- * @param string day in format DD
- * @param string year in format CCYY
- * @param string month in format MM
- * @param string day in format DD
- *
- * @access public
- *
- * @return int absolute number of days between dates,
- * -1 if there is an error.
- */
-
- function dateDiff($day1,$month1,$year1,$day2,$month2,$year2)
- {
- if(!Date_Calc::isValidDate($day1,$month1,$year1))
- return -1;
- if(!Date_Calc::isValidDate($day2,$month2,$year2))
- return -1;
-
- return(abs((Date_Calc::dateToDays($day1,$month1,$year1))
- - (Date_Calc::dateToDays($day2,$month2,$year2))));
-
- } // end func dateDiff
-
- /**
- * Find the number of days in the given month.
- *
- * @param string month in format MM, default current local month
- *
- * @access public
- *
- * @return int number of days
- */
-
- function daysInMonth($month="",$year="")
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
-
- if($month == 2)
- {
- if(Date_Calc::isLeapYear($year))
- return 29;
- else
- return 28;
- }
- elseif($month == 4 or $month == 6 or $month == 9 or $month == 11)
- return 30;
- else
- return 31;
-
- } // end func daysInMonth
-
- /**
- * Returns the number of rows on a calendar month. Useful for
- * determining the number of rows when displaying a typical
- * month calendar.
- *
- * @param string month in format MM, default current local month
- * @param string year in format YYCC, default current local year
- *
- * @access public
- *
- * @return int number of weeks
- */
-
- function weeksInMonth($month="",$year="")
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
-
- return ceil((Date_Calc::daysInMonth($month,$year)+Date_Calc::firstOfMonthWeekday($month,$year) - DATE_CALC_BEGIN_WEEKDAY)/7);
-
- } // end func weeksInMonth
-
- /**
- * Find the day of the week for the first of the month of given date.
- *
- * @param string year in format CCYY, default to current local year
- * @param string month in format MM, default to current local month
- *
- * @access public
- *
- * @return int number of weekday for the first day, 0=Sunday
- */
-
- function firstOfMonthWeekday($month="",$year="")
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
-
- return(Date_Calc::dayOfWeek("01",$month,$year));
-
- } // end func firstOfMonthWeekday
-
- /**
- * Return date of first day of month of given date.
- *
- * @param string year in format CCYY, default current local year
- * @param string month in format MM, default current local month
- * @param string format for returned date
- *
- * @access public
- *
- * @return string date in given format
- */
-
- function beginOfMonth($month="",$year="",$format="%Y%m%d")
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
-
- return(Date_Calc::dateFormat("01",$month,$year,$format));
-
- } // end of func beginOfMonth
-
- /**
- * Find the month day of the beginning of week for given date,
- * using DATE_CALC_BEGIN_WEEKDAY. (can return weekday of prev month.)
- *
- * @param string year in format CCYY, default current local year
- * @param string month in format MM, default current local month
- * @param string day in format DD, default current local day
- * @param string format for returned date
- *
- * @access public
- *
- * @return string date in given format
- */
-
- function beginOfWeek($day="",$month="",$year="",$format="%Y%m%d")
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
- if(empty($day))
- $day = Date_Calc::dateNow("%d");
-
- $this_weekday = Date_Calc::dayOfWeek($day,$month,$year);
-
- $beginOfWeek = (Date_Calc::dateToDays($day,$month,$year)
- - ($this_weekday - DATE_CALC_BEGIN_WEEKDAY));
-
- return(Date_Calc::daysToDate($beginOfWeek,$format));
-
- } // end of func beginOfWeek
-
- /**
- * Find the month day of the end of week for given date,
- * using DATE_CALC_BEGIN_WEEKDAY. (can return weekday
- * of following month.)
- *
- * @param string year in format CCYY, default current local year
- * @param string month in format MM, default current local month
- * @param string day in format DD, default current local day
- * @param string format for returned date
- *
- * @access public
- *
- * @return string date in given format
- */
-
- function endOfWeek($day="",$month="",$year="",$format="%Y%m%d")
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
- if(empty($day))
- $day = Date_Calc::dateNow("%d");
-
- $this_weekday = Date_Calc::dayOfWeek($day,$month,$year);
-
- $last_dayOfWeek = (Date_Calc::dateToDays($day,$month,$year)
- + (6 - $this_weekday + DATE_CALC_BEGIN_WEEKDAY));
-
- return(Date_Calc::daysToDate($last_dayOfWeek,$format));
-
- } // end func endOfWeek
-
- /**
- * Find the month day of the beginning of week after given date,
- * using DATE_CALC_BEGIN_WEEKDAY. (can return weekday of prev month.)
- *
- * @param string year in format CCYY, default current local year
- * @param string month in format MM, default current local month
- * @param string day in format DD, default current local day
- * @param string format for returned date
- *
- * @access public
- *
- * @return string date in given format
- */
-
- function beginOfNextWeek($day="",$month="",$year="",$format="%Y%m%d")
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
- if(empty($day))
- $day = Date_Calc::dateNow("%d");
-
- $date = Date_Calc::daysToDate(Date_Calc::dateToDays($day+7,$month,$year),"%Y%m%d");
-
- $next_week_year = substr($date,0,4);
- $next_week_month = substr($date,4,2);
- $next_week_day = substr($date,6,2);
-
- $this_weekday = Date_Calc::dayOfWeek($next_week_day,$next_week_month,$next_week_year);
-
- $beginOfWeek = (Date_Calc::dateToDays($next_week_day,$next_week_month,$next_week_year)
- - ($this_weekday - DATE_CALC_BEGIN_WEEKDAY));
-
- return(Date_Calc::daysToDate($beginOfWeek,$format));
-
- } // end func beginOfNextWeek
-
- /**
- * Find the month day of the beginning of week before given date,
- * using DATE_CALC_BEGIN_WEEKDAY. (can return weekday of prev month.)
- *
- * @param string year in format CCYY, default current local year
- * @param string month in format MM, default current local month
- * @param string day in format DD, default current local day
- * @param string format for returned date
- *
- * @access public
- *
- * @return string date in given format
- */
-
- function beginOfPrevWeek($day="",$month="",$year="",$format="%Y%m%d")
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
- if(empty($day))
- $day = Date_Calc::dateNow("%d");
-
- $date = Date_Calc::daysToDate(Date_Calc::dateToDays($day-7,$month,$year),"%Y%m%d");
-
- $next_week_year = substr($date,0,4);
- $next_week_month = substr($date,4,2);
- $next_week_day = substr($date,6,2);
-
- $this_weekday = Date_Calc::dayOfWeek($next_week_day,$next_week_month,$next_week_year);
-
- $beginOfWeek = (Date_Calc::dateToDays($next_week_day,$next_week_month,$next_week_year)
- - ($this_weekday - DATE_CALC_BEGIN_WEEKDAY));
-
- return(Date_Calc::daysToDate($beginOfWeek,$format));
-
- } // end func beginOfPrevWeek
-
- /**
- * Return an array with days in week
- *
- * @param string year in format CCYY, default current local year
- * @param string month in format MM, default current local month
- * @param string day in format DD, default current local day
- * @param string format for returned date
- *
- * @access public
- *
- * @return array $week[$weekday]
- */
-
- function getCalendarWeek($day="",$month="",$year="",$format="%Y%m%d")
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
- if(empty($day))
- $day = Date_Calc::dateNow("%d");
-
- $week_array = array();
-
- // date for the column of week
- $curr_day = (Date_Calc::dateToDays($day,$month,$year)
- - ((Date_Calc::dayOfWeek($day,$month,$year) - DATE_CALC_BEGIN_WEEKDAY)));
-
- for($counter=0; $counter <= 6; $counter++)
- {
- $week_array[$counter] = Date_Calc::daysToDate($curr_day,$format);
- $curr_day++;
- }
-
- return $week_array;
-
- } // end func getCalendarWeek
-
- /**
- * Return a set of arrays to construct a calendar month for
- * the given date.
- *
- * @param string year in format CCYY, default current local year
- * @param string month in format MM, default current local month
- * @param string format for returned date
- *
- * @access public
- *
- * @return array $month[$row][$col]
- */
-
- function getCalendarMonth($month="",$year="",$format="%Y%m%d")
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
-
- $month_array = array();
-
- // date for the first row, first column of calendar month
- $curr_day = (Date_Calc::dateToDays("01",$month,$year)
- - Date_Calc::firstOfMonthWeekday($month,$year) + DATE_CALC_BEGIN_WEEKDAY);
-
- // number of days in this month
- $daysInMonth = Date_Calc::daysInMonth($month,$year);
-
- $weeksInMonth = Date_Calc::weeksInMonth($month,$year);
- for($row_counter=0; $row_counter < $weeksInMonth; $row_counter++)
- {
- for($column_counter=0; $column_counter <= 6; $column_counter++)
- {
- $month_array[$row_counter][$column_counter] = Date_Calc::daysToDate($curr_day,$format);
- $curr_day++;
- }
- }
-
- return $month_array;
-
- } // end func getCalendarMonth
-
- /**
- * Return a set of arrays to construct a calendar year for
- * the given date.
- *
- * @param string year in format CCYY, default current local year
- * @param string format for returned date
- *
- * @access public
- *
- * @return array $year[$month][$row][$col]
- */
-
- function getCalendarYear($year="",$format="%Y%m%d")
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
-
- $year_array = array();
-
- for($curr_month=0; $curr_month <=11; $curr_month++)
- {
-
- $year_array[$curr_month] = Date_Calc::getCalendarMonth(sprintf("%02d",$curr_month+1),$year,$format);
-
- /* for ($x=0; $x< count($year_array[$curr_month]); $x++)
- {
- for($y=0; $y< count($year_array[$curr_month][$x]); $y++)
- {
- echo "DEBUG: $x,$y:".$year_array[$curr_month][$x][$y]."<br>\n";
- }
- } */
- }
-
- return $year_array;
-
- } // end func getCalendarYear
-
- /**
- * Converts a date to number of days since a
- * distant unspecified epoch.
- *
- * @param string year in format CCYY
- * @param string month in format MM
- * @param string day in format DD
- *
- * @access public
- *
- * @return integer number of days
- */
-
- function dateToDays($day,$month,$year)
- {
-
- $century = substr($year,0,2);
- $year = substr($year,2,2);
-
- if($month > 2)
- $month -= 3;
- else
- {
- $month += 9;
- if($year)
- $year--;
- else
- {
- $year = 99;
- $century --;
- }
- }
-
- return ( floor(( 146097 * $century) / 4 ) +
- floor(( 1461 * $year) / 4 ) +
- floor(( 153 * $month + 2) / 5 ) +
- $day + 1721119);
-
- } // end func dateToDays
-
- /**
- * Converts number of days to a distant unspecified epoch.
- *
- * @param int number of days
- * @param string format for returned date
- *
- * @access public
- *
- * @return string date in specified format
- */
-
- function daysToDate($days,$format="%Y%m%d")
- {
-
- $days -= 1721119;
- $century = floor(( 4 * $days - 1) / 146097);
- $days = floor(4 * $days - 1 - 146097 * $century);
- $day = floor($days / 4);
-
- $year = floor(( 4 * $day + 3) / 1461);
- $day = floor(4 * $day + 3 - 1461 * $year);
- $day = floor(($day + 4) / 4);
-
- $month = floor(( 5 * $day - 3) / 153);
- $day = floor(5 * $day - 3 - 153 * $month);
- $day = floor(($day + 5) / 5);
-
- if($month < 10)
- $month +=3;
- else
- {
- $month -=9;
- if($year++ == 99)
- {
- $year = 0;
- $century++;
- }
- }
-
- $century = sprintf("%02d",$century);
- $year = sprintf("%02d",$year);
-
- return(Date_Calc::dateFormat($day,$month,$century.$year,$format));
-
- } // end func daysToDate
-
- /**
- * Calculates the date of the Nth weekday of the month,
- * such as the second Saturday of January 2000.
- *
- * @param string occurance: 1=first, 2=second, 3=third, etc.
- * @param string dayOfWeek: 0=Sunday, 1=Monday, etc.
- * @param string year in format CCYY
- * @param string month in format MM
- * @param string format for returned date
- *
- * @access public
- *
- * @return string date in given format
- */
-
- function NWeekdayOfMonth($occurance,$dayOfWeek,$month,$year,$format="%Y%m%d") {
-
- $year = sprintf("%04d",$year);
- $month = sprintf("%02d",$month);
-
- $DOW1day = sprintf("%02d",(($occurance - 1) * 7 + 1));
- $DOW1 = Date_Calc::dayOfWeek($month,$year,$DOW1day);
-
- $wdate = ($occurance - 1) * 7 + 1 +
- (7 + $dayOfWeek - $DOW1) % 7;
-
- if( $wdate > Date_Calc::daysInMonth($month,$year))
- return -1;
- else
- return(Date_Calc::dateFormat($month,$year,$wdate,$format));
-
- } // end func NWeekdayOfMonth
-
- /**
- * Formats the date in the given format, much like
- * strfmt(). This function is used to alleviate the
- * problem with 32-bit numbers for dates pre 1970
- * or post 2038, as strfmt() has on most systems.
- * Most of the formatting options are compatible.
- *
- * formatting options:
- *
- * %a abbreviated weekday name (Sun, Mon, Tue)
- * %A full weekday name (Sunday, Monday, Tuesday)
- * %b abbreviated month name (Jan, Feb, Mar)
- * %B full month name (January, February, March)
- * %d day of month (range 00 to 31)
- * %e day of month, single digit (range 0 to 31)
- * %E number of days since unspecified epoch (integer)
- * (%E is useful for passing a date in a URL as
- * an integer value. Then simply use
- * daysToDate() to convert back to a date.)
- * %j day of year (range 001 to 366)
- * %m month as decimal number (range 1 to 12)
- * %n newline character (\n)
- * %t tab character (\t)
- * %w weekday as decimal (0 = Sunday)
- * %U week number of current year, first sunday as first week
- * %y year as decimal (range 00 to 99)
- * %Y year as decimal including century (range 0000 to 9999)
- * %% literal '%'
- *
- * @param string year in format CCYY
- * @param string month in format MM
- * @param string day in format DD
- * @param string format for returned date
- *
- * @access public
- *
- * @return string date in given format
- */
-
- function dateFormat($day,$month,$year,$format)
- {
- if(!Date_Calc::isValidDate($day,$month,$year))
- {
- $year = Date_Calc::dateNow("%Y");
- $month = Date_Calc::dateNow("%m");
- $day = Date_Calc::dateNow("%d");
- }
-
- $output = "";
-
- for($strpos = 0; $strpos < strlen($format); $strpos++)
- {
- $char = substr($format,$strpos,1);
- if($char == "%")
- {
- $nextchar = substr($format,$strpos + 1,1);
- switch($nextchar)
- {
- case "a":
- $output .= Date_Calc::getWeekdayAbbrname($day,$month,$year);
- break;
- case "A":
- $output .= Date_Calc::getWeekdayFullname($day,$month,$year);
- break;
- case "b":
- $output .= Date_Calc::getMonthAbbrname($month);
- break;
- case "B":
- $output .= Date_Calc::getMonthFullname($month);
- break;
- case "d":
- $output .= sprintf("%02d",$day);
- break;
- case "e":
- $output .= $day;
- break;
- case "E":
- $output .= Date_Calc::dateToDays($day,$month,$year);
- break;
- case "j":
- $output .= Date_Calc::julianDate($day,$month,$year);
- break;
- case "m":
- $output .= sprintf("%02d",$month);
- break;
- case "n":
- $output .= "\n";
- break;
- case "t":
- $output .= "\t";
- break;
- case "w":
- $output .= Date_Calc::dayOfWeek($day,$month,$year);
- break;
- case "U":
- $output .= Date_Calc::weekOfYear($day,$month,$year);
- break;
- case "y":
- $output .= substr($year,2,2);
- break;
- case "Y":
- $output .= $year;
- break;
- case "%":
- $output .= "%";
- break;
- default:
- $output .= $char.$nextchar;
- }
- $strpos++;
- }
- else
- {
- $output .= $char;
- }
- }
- return $output;
-
- } // end func dateFormat
-
- /**
- * Returns the current local year in format CCYY
- *
- * @access public
- *
- * @return string year in format CCYY
- */
-
- function getYear()
- {
- return Date_Calc::dateNow("%Y");
-
- } // end func getYear
-
- /**
- * Returns the current local month in format MM
- *
- * @access public
- *
- * @return string month in format MM
- */
-
- function getMonth()
- {
- return Date_Calc::dateNow("%m");
-
- } // end func getMonth
-
- /**
- * Returns the current local day in format DD
- *
- * @access public
- *
- * @return string day in format DD
- */
-
- function getDay()
- {
- return Date_Calc::dateNow("%d");
-
- } // end func getDay
-
- /**
- * Returns the full month name for the given month
- *
- * @param string month in format MM
- *
- * @access public
- *
- * @return string full month name
- */
-
- function getMonthFullname($month)
- {
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
-
- $month_names = array("January","February","March","April","May","June",
- "July","August","September","October","November","December");
-
- return $month_names[($month - 1)];
-
- } // end func getMonthFullname
-
- /**
- * Returns the abbreviated month name for the given month
- *
- * @param string month in format MM
- * @param int optional length of abbreviation, default is 3
- *
- * @access public
- *
- * @return string abbreviated month name
- */
-
- function getMonthAbbrname($month,$length=3)
- {
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
-
- $month_names = array("January","February","March","April","May","June",
- "July","August","September","October","November","December");
-
- return substr($month_names[($month - 1)],0,$length);
-
- } // end func getMonthAbbrname
-
- /**
- * Returns the full weekday name for the given date
- *
- * @param string year in format CCYY, default current local year
- * @param string month in format MM, default current local month
- * @param string day in format DD, default current local day
- *
- * @access public
- *
- * @return string full month name
- */
-
- function getWeekdayFullname($day="",$month="",$year="")
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
- if(empty($day))
- $day = Date_Calc::dateNow("%d");
-
- $weekday_names = array("Sunday","Monday","Tuesday",
- "Wednesday","Thursday","Friday","Saturday");
- $weekday = Date_Calc::dayOfWeek($day,$month,$year);
-
- return $weekday_names[$weekday];
-
- } // end func getWeekdayFullname
-
- /**
- * Returns the abbreviated weekday name for the given date
- *
- * @param string year in format CCYY, default current local year
- * @param string month in format MM, default current local month
- * @param string day in format DD, default current local day
- * @param int optional length of abbreviation, default is 3
- *
- * @access public
- *
- * @return string full month name
- */
-
- function getWeekdayAbbrname($day="",$month="",$year="",$length=3)
- {
- if(empty($year))
- $year = Date_Calc::dateNow("%Y");
- if(empty($month))
- $month = Date_Calc::dateNow("%m");
- if(empty($day))
- $day = Date_Calc::dateNow("%d");
-
- $weekday_names = array("Sunday","Monday","Tuesday",
- "Wednesday","Thursday","Friday","Saturday");
-
- $weekday = Date_Calc::dayOfWeek($day,$month,$year);
-
- return substr($weekday_names[$weekday],0,$length);
-
- } // end func getWeekdayFullname
-
- } // end class Date_calendar
-
- ?>
-